﻿namespace Digitalmes.Common.Utils;

/// <summary>
/// 枚举帮助类
/// </summary>
public static class EnumUtils
{
    /// <summary>
    /// 获得枚举的描述信息 <see cref="DescriptionAttribute"/>，没有设置则返回枚举文本值。
    /// </summary>
    /// <param name="enumValue">枚举对象</param>
    /// <returns></returns>
    public static string Description(this Enum enumValue)
    {
        var value = enumValue.ToString();
        var field = enumValue.GetType().GetField(value);
        var attr = field?.GetCustomAttribute<DescriptionAttribute>(false);
        if (attr is null)
            return value;
        
        return attr.Description;
    }

    /// <summary>
    /// 合并带有 <see cref="FlagsAttribute"/> 标识的枚举实例。
    /// </summary>
    /// <typeparam name="TEnum"></typeparam>
    /// <param name="enumValue">枚举实例</param>
    /// <returns></returns>
    public static List<TEnum> SplitEnum<TEnum>(this TEnum enumValue) where TEnum : Enum
    {
        var result = new List<TEnum>();
        foreach (TEnum item in Enum.GetValues(typeof(TEnum)))
        {
            int value = Convert.ToInt32(item);
            int source = Convert.ToInt32(enumValue);
            if ((value & source) == value)
            {
                result.Add(item);
            }
        }
        return result;
    }

    /// <summary>
    /// 合并带有 <see cref="FlagsAttribute"/> 标识的枚举实例。
    /// </summary>
    /// <typeparam name="TEnum"></typeparam>
    /// <param name="enums">枚举实例</param>
    /// <returns></returns>
    public static TEnum MergeEnum<TEnum>(this IEnumerable<TEnum> enums) where TEnum : struct, Enum
    {
        int enumValue = 0;
        foreach (TEnum item in enums)
        {
            enumValue |= Convert.ToInt32(item);
        }

        return Enum.Parse<TEnum>(enumValue.ToString());
    }
}
